
/**********************************************************************************\
** 文件名称: menu.h
** 创建人员: YCG
** 创建日期: 2019-01-19
** 文档描述: 
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#ifndef __MENU_H_
#define __MENU_H_

#include "main.h"
#include "mylist.h"
#include "heap.h"
#include	"mycmd.h"

#define MENU_DEBUG
#ifdef  MENU_DEBUG
#include "MessageOut.h"
#define  MENU_Printf(fmt,...)   Uprintf(fmt,__VA_ARGS__)
#else
#define  MENU_Printf(...)
#endif

#define MENU_NAME_SIZE 8    //菜单名长度      

#define MENU_OVER     0    //菜单运行结束
#define MENU_NO_Init  1    //未初始化
#define MENU_Update   2    //刷新
#define MENU_RunFree  3    //运行空的
#define MENU_RunTask  4    //运行任务
#define MENU_GoNext   5    //切换到下级菜单
#define MENU_Return   6    //返回级菜单

//#define MENU_Del      7     //菜单删除
//#define MENU_Pend     8     //菜单挂起
//#define MENU_StartResume  9     //恢复菜单
//#define MENU_InResume   10     //恢复菜单

#define MENU_CMD_ToMenu   0     //CMD控制属于菜单
#define MENU_CMD_ToItem   1     //CMD控制属于菜单项
//#define MENU_CMD_ToResume 2     //CMD控制属于任务恢复项

#define MENU_CMD_OK       0
#define MENU_CMD_BACK     1
#define MENU_CMD_UP       2
#define MENU_CMD_DOWM     3
#define MENU_CMD_LEFT     4
#define MENU_CMD_RIGHT    5

#define MENU_CMD_WaitToReturn    6   //等待返回，菜单内部命令

#define MENU_CMD_State(yMenuHead)   (yMenuHead->Cmd->CmdDat[3])

struct MENU_T;
typedef struct MENU_T MenuHead_t;
struct MENUITEM_T;
typedef struct MENUITEM_T MenuItem_t;

struct MENU_T
{
    MyListItem_t*  Index;            //此时操作的菜单列表项
    uint32_t       ListNum;          //菜单列表项的数量
    MyListItem_t   EndItem[1];       //列表项的最后一个

	  uint32_t       RunState;         //菜单的运行状态		
    uint8_t        Name[MENU_NAME_SIZE]; //菜单名称
    CmdHead_t*     Cmd;              //CMD控制对象

	  MenuHead_t*    MainMenu;         //主菜单
	  MenuHead_t*    IndexMenu;        //当前菜单
	  MenuHead_t*    PreMenu;          //上级菜单
	
	  void           (*Init)(MenuHead_t *yMenuHead);    //初始化函数
		void           (*Update)(MenuHead_t *yMenuHead);  //刷新
		void           (*Free)(MenuHead_t *yMenuHead);    //菜单运行
		void           (*Resume)(MyList_t* yList);        //菜单运行
};

 struct MENUITEM_T
{
    MyListItem_t      *Pre;        //指向上一个一个列表项
    MyListItem_t      *Next;       //指向下一个列表项
    MyList_t          *Head;       //所属的列表
    uint32_t           Value;      //列表项的值
	
    void              (*Task)(MenuItem_t *yMenuItem);  //菜单项任务  //2选一
	  MenuHead_t         *Menu;         //子菜单
	
    uint8_t Name[MENU_NAME_SIZE];     //菜单名称
	
} ;


MenuHead_t* Menu_Create(
    uint8_t* yName,
    void     (*yInit)(MenuHead_t *yMenuHead),
    void     (*yUpdate)(MenuHead_t *yMenuHead),
    void     (*yFree)(MenuHead_t *yMenuHead),
    void     (*yResume)(MyList_t* yList)
);
MenuItem_t* Menu_AddItem(MenuHead_t* yMenuHead, uint8_t* yName, void(*yTask)(MenuItem_t *yMenuItem));
MenuItem_t* Menu_AddSubMenu(MenuHead_t* yMenuHead, uint8_t* yName, MenuHead_t* ySubMenuHead) ;
void Menu_Run(MenuHead_t* yMenuHead);

#endif

/********************************End of File************************************/

